En Casa Rosada existe un servicio interno de “remisería” para realizar viajes laborales.
Hay un grupo de vehículos asignados a funcionarios determinados (con choferes fijos) y otro grupo de vehículos que son utilizados por diferentes choferes según las necesidades del día a día.
Los viajes se registran en un sistema de manera manual.
Para poder utilizar los datos en este trabajo se realizaron las siguientes ediciones a la base:
#install.packages("sf")
#install.packages("leaflet")
#install.packages("janitor") #https://elradar.github.io/2019/10/19/un-cran-a-la-vez-janitor/
#install.packages("openxlsx")
#install.packages("osrm")
#install.packages("osmdata")
#install.packages("plotly")
#install.packages("ggmap")
#install.packages("lubridate")
library(tidyverse)
library(readxl)
library(ggplot2)
library(sf) # Manipulacion de datos geográficos
library(leaflet) # Graficos interactivos
library(raster) # classes and functions for raster data
library(lubridate) # Fechas y horas
library(hms) # Horas - Minutos y Segundos
library(janitor) # limpieza de datos importados desde excel
library(openxlsx) # Exporta datos a excel #write.xlsx(escuelas, "escuelasguardadas.xlsx")
library(osrm)
library(osmdata)
library(plotly)
library(htmltools)
library(RColorBrewer)
library(ggmap)
library(gmapsdistance)
options(scipen=20)#dice cuantos 0 acepta antes de usar la notacion científica
departamentos <- st_read("Codgeo_Pais_x_dpto_con_datos/pxdptodatosok.shp")
## Reading layer `pxdptodatosok' from data source `C:\Users\ejsan\Google Drive\DB\06-Desarrollo\Curso R UDESA\Proyecto\Codgeo_Pais_x_dpto_con_datos\pxdptodatosok.shp' using driver `ESRI Shapefile'
## Simple feature collection with 527 features and 10 fields
## geometry type: MULTIPOLYGON
## dimension: XY
## bbox: xmin: -74.02985 ymin: -90 xmax: -25.02314 ymax: -21.74506
## epsg (SRID): 4326
## proj4string: +proj=longlat +datum=WGS84 +no_defs
viajes <- read_excel("base_transporte_terrestre_guardia.xlsx")
str(viajes)
## Classes 'tbl_df', 'tbl' and 'data.frame': 2200 obs. of 19 variables:
## $ ID : num 289 702 777 1059 976 ...
## $ Estado : chr "cerrada" "cerrada" "cerrada" "cerrada" ...
## $ Resumen : chr "VIAJE UNIDAD.MEDICA" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" ...
## $ Descripción : chr "VIAJE UNIDAD.MEDICA" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" "VIAJE SEC GENERAL" ...
## $ 0.1.1 - Dependencia : chr "Unidad Médica Presidencial" "Secretaría General" "Secretaría General" "Secretaría General" ...
## $ 7.0.1 - Origen : chr "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" "Peron, Juan Domingo, Tte. General 115" ...
## $ latitud_origen : chr "-34.604793" "-34.604793" "-34.604793" "-34.604793" ...
## $ longitud_origen : chr "-58.369208" "-58.369208" "-58.369208" "-58.369208" ...
## $ 7.0.1 - Pasajero : chr "DR.COSTA" "FEDERICO M" "FEDERICO M" "FEDERICO M" ...
## $ 7 0 2 - Destino OK : chr "Av. Comodoro Py 2002" "Guatemala 4201" "Guatemala 4201" "Guatemala 4201" ...
## $ latitud_destino : chr "-34.587579" "-34.589203" "-34.589203" "-34.589203" ...
## $ longitud_destino : chr "-58.369092" "-58.419093" "-58.419093" "-58.419093" ...
## $ 7.0.3 - Fecha Viaje : chr "14-11-2018" "14-09-2018" "06-09-2018" "03-08-2018" ...
## $ 7.0.4 - Hora Salida : chr "23:30" "22:30" "22:00" "23:00" ...
## $ 7.0.4.1 - Hora Solicitada : chr NA "23:15" "23:10" "23:55" ...
## $ 7.0.4.2 - Hora Destino Funcionario: chr NA NA NA NA ...
## $ 7.0.5 - Hora Regreso : chr "01:30" "00:30" "00:00" "01:20" ...
## $ 7.0.6 - Conductor : chr "GARCIA Mario Antonio" "ROCHA Juan Marcelo" NA "ROCHA Juan Marcelo" ...
## $ 7.0.7 - DoTiTio VIhícuMo : chr "AA568.TI" "AA568TI" "AA568TI" "TTT991" ...
Acá se pueden ver que hay datos de longitud y latitud con y sin apóstrofe inicial (“’-58.456663” “-58.397926”) y con finales de línea “ r n”. Hay que quitar el apóstrofe inicial y los finales de línea para poder mapear el dato.
summary(viajes)
## ID Estado Resumen Descripción
## Min. : 1.0 Length:2200 Length:2200 Length:2200
## 1st Qu.: 550.8 Class :character Class :character Class :character
## Median :1100.5 Mode :character Mode :character Mode :character
## Mean :1100.5
## 3rd Qu.:1650.2
## Max. :2200.0
## 0.1.1 - Dependencia 7.0.1 - Origen latitud_origen
## Length:2200 Length:2200 Length:2200
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## longitud_origen 7.0.1 - Pasajero 7 0 2 - Destino OK
## Length:2200 Length:2200 Length:2200
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## latitud_destino longitud_destino 7.0.3 - Fecha Viaje
## Length:2200 Length:2200 Length:2200
## Class :character Class :character Class :character
## Mode :character Mode :character Mode :character
##
##
##
## 7.0.4 - Hora Salida 7.0.4.1 - Hora Solicitada
## Length:2200 Length:2200
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## 7.0.4.2 - Hora Destino Funcionario 7.0.5 - Hora Regreso
## Length:2200 Length:2200
## Class :character Class :character
## Mode :character Mode :character
##
##
##
## 7.0.6 - Conductor 7.0.7 - DoTiTio VIhícuMo
## Length:2200 Length:2200
## Class :character Class :character
## Mode :character Mode :character
##
##
##
Acá se puede observar que hay que modificar el tipo de dato de los campos horas para poder realizar cálculos de tiempos de viaje. Ver transformación char a horas:minutos
# Cambio de nombre de las columnas
names(viajes)=c("id_viaje", "estado","resumen","descripcion","dependencia","origen","latitud_origen","longitud_origen","pasajero","destino","latitud_destino","longitud_destino","fecha_viaje","hora_salida","hora_solicitada","hora_destino_funcionario","hora_regreso","conductor","patente_vehiculo")
# Retiro columnas que no tienen relevancia para el trabajo
viajes <- viajes %>%
select(-resumen, -descripcion, -estado, -hora_destino_funcionario, -hora_solicitada)
head(viajes)
## # A tibble: 6 x 14
## id_viaje dependencia origen latitud_origen longitud_origen pasajero
## <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 289 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.COSTA
## 2 702 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 3 777 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 4 1059 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 5 976 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.HOFF~
## 6 2025 Admin. Ser~ Peron~ -34.604793 -58.369208 ARIAS
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## # longitud_destino <chr>, fecha_viaje <chr>, hora_salida <chr>,
## # hora_regreso <chr>, conductor <chr>, patente_vehiculo <chr>
# Quito puntos, guiones, dos puntos
viajes$patente_vehiculo <- gsub("[[:punct:]]", "", viajes$patente_vehiculo)
#grabo modificaciones en nueva variable
viajes_a <- viajes
#Paso las horas a formato hora usando paquete hms
viajes_b$hora_salida <- parse_hm(viajes_b$hora_salida)
viajes_b$hora_regreso <- parse_hm(viajes_b$hora_regreso)
head(viajes_b)
## # A tibble: 6 x 14
## id_viaje dependencia origen latitud_origen longitud_origen pasajero
## <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 289 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.COSTA
## 2 702 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 3 777 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 4 1059 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 5 976 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.HOFF~
## 6 2025 Admin. Ser~ Peron~ -34.604793 -58.369208 ARIAS
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## # longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## # hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>
Volver a Vista general de datos
# Reviso valores NA
sapply(viajes_b,function(x) sum(is.na(x)))
## id_viaje dependencia origen latitud_origen
## 0 0 0 0
## longitud_origen pasajero destino latitud_destino
## 0 0 0 0
## longitud_destino fecha_viaje hora_salida hora_regreso
## 0 0 73 211
## conductor patente_vehiculo
## 71 39
# Retiro filas con patentes_vehiculo y conductor NA
viajes_b <- viajes_b[!is.na(viajes_b$patente_vehiculo),]
viajes_b <- viajes_b[!is.na(viajes_b$conductor),]
# Quito viajes con horas NA
viajes_b <- viajes_b[!is.na(viajes_b$hora_salida),]
viajes_b <- viajes_b[!is.na(viajes_b$hora_regreso),]
#grabo modificaciones en nueva variable
viajes_c <- viajes_b
# Reviso si existen horas de regreso menores a los horarios de salida.
a <- filter(viajes_c, hora_salida > hora_regreso)
a
## # A tibble: 6 x 14
## id_viaje dependencia origen latitud_origen longitud_origen pasajero
## <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 289 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.COSTA
## 2 702 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 3 1059 Secretaría~ Peron~ -34.604793 -58.369208 FEDERIC~
## 4 976 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.HOFF~
## 5 999 Unidad Méd~ Peron~ -34.604793 -58.369208 DR.HOFF~
## 6 2043 Dir. Gral.~ Peron~ -34.604793 -58.369208 JULIETA~
## # ... with 8 more variables: destino <chr>, latitud_destino <chr>,
## # longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## # hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>
viajes_c <- filter(viajes_c, hora_salida<hora_regreso)
# Calculo duracion de viajes en minutos
viajes_c <- viajes_c %>%
mutate(duracion_viaje = difftime(viajes_c$hora_regreso,viajes_c$hora_salida))
# Paso la diferencia horaria a formato numero
viajes_c <- viajes_c %>%
mutate(duracion_viaje_numerico = as.numeric(viajes_c$duracion_viaje))
head(viajes_c$duracion_viaje_numerico)
## [1] 10 10 15 20 20 20
#grabo modificaciones en nueva variable
viajes_d <- viajes_c
hist(viajes_d$duracion_viaje_numerico, main="Viajes",
xlab="Duración de los Viajes en Minuto",
ylab = "Cantidad de Viajes",
col="magenta")
La mayor parte de los viajes tiene una duración menor a 200 minutos-
summary(viajes_d$duracion_viaje_numerico)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 10.0 70.0 105.0 121.5 150.0 990.0
ggplot(viajes_d) +
geom_histogram(aes(x = duracion_viaje_numerico),
binwidth = 30, col="orange",
fill="green",
alpha = .3) +
labs(
title="Viajes",
subtitle = "Cantidad de Viajes x Duración",
x = "Duración de los Viajes en Minutos",
y = "Cantidad de Viajes" )
#tabla de viajes por conductor
viajes_por_conductor <- viajes_d %>%
group_by(conductor) %>%
summarise(
cant_viajes=n(),
hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
promedio_tiempo_viaje_min = round(mean(duracion_viaje_numerico),digits=2),
destinos_distintos = n_distinct(destino),
cant_autos_que_maneja = n_distinct(patente_vehiculo)
)
head(viajes_por_conductor)
## # A tibble: 6 x 6
## conductor cant_viajes hora_totales_vi~ promedio_tiempo~ destinos_distin~
## <chr> <int> <dbl> <dbl> <int>
## 1 ALVAREZ ~ 42 108 154. 16
## 2 ARIAS Cl~ 81 170. 126. 27
## 3 BRANDAN ~ 16 31.1 117. 10
## 4 BULGOS E~ 23 58 151. 13
## 5 CAPOZZUC~ 141 257. 109. 31
## 6 CATRILEF~ 116 228. 118. 30
## # ... with 1 more variable: cant_autos_que_maneja <int>
ggplot() +
geom_bar(data = viajes_por_conductor,
aes(x = reorder(conductor, cant_viajes),
weight = cant_viajes,
fill = cant_autos_que_maneja) )+
scale_fill_continuous(low="yellow", high="red")+
labs(
title="Cantidad de Viajes por Conductor",
subtitle = "Cantidad de autos que maneja cada conductor",
x = "Conductor",
y = "Cantidad de viajes" )+
coord_flip()
#tabla de viajes por conductor
viajes_por_dependencia <- viajes_d %>%
group_by(dependencia) %>%
summarise(
cant_viajes=n(),
promedio_tiempo_viaje_min = round(mean(duracion_viaje_numerico),digits=2),
destinos_distintos = n_distinct(destino),
)
head(viajes_por_dependencia)
## # A tibble: 6 x 4
## dependencia cant_viajes promedio_tiempo_via~ destinos_distin~
## <chr> <int> <dbl> <int>
## 1 Admin. Servicios Gener~ 196 125. 37
## 2 Agrupación Aérea 2 172. 2
## 3 Asesor Presidencial 3 205 3
## 4 ASG - Departamento de ~ 2 160 2
## 5 ASG - Departamento de ~ 340 77.4 41
## 6 ASG - Economato 208 140. 20
ggplot() +
geom_bar(data = viajes_por_dependencia,
aes(x = reorder(dependencia, cant_viajes),
weight = cant_viajes),fill = "green", color = "orange", alpha = .3) +
labs(
title="Viajes por Dependencia",
x = "Dependencia",
y = "Cantidad de Viajes" )+
coord_flip()
#viajes por vehiculo
viajes_por_vehiculo <- viajes_d %>%
group_by(patente_vehiculo) %>%
summarise(
cant_viajes=n(),
hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
destinos_distintos = n_distinct(destino),
conductores_distintos = n_distinct(conductor),
)
head(viajes_por_vehiculo)
## # A tibble: 6 x 5
## patente_vehiculo cant_viajes hora_totales_vi~ destinos_distin~
## <chr> <int> <dbl> <int>
## 1 0XC263 1 5.25 1
## 2 AA468MS 1 1.5 1
## 3 AA523MP 349 710. 44
## 4 AA523MS 128 229. 27
## 5 AA523MT 7 10 4
## 6 AA523MX 4 6.17 3
## # ... with 1 more variable: conductores_distintos <int>
ggplot(viajes_por_vehiculo,
aes(y = cant_viajes,x = reorder(patente_vehiculo, cant_viajes),
weight = cant_viajes,
fill = hora_totales_viaje) ) +
geom_bar(position="stack", stat="identity") +
scale_fill_continuous(low="yellow", high="red")+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(
title="Viajes por Vehículo",
x = "Patente Vehículo",
y = "Cantidad de Viajes" )+
geom_text(aes(label=cant_viajes), vjust=1.5, color="white", size=3, angle = 90)
viajes_por_vehiculo_25 <- viajes_por_vehiculo %>%
filter(cant_viajes>25)
ggplot(viajes_por_vehiculo_25,
aes(y = cant_viajes,x = reorder(patente_vehiculo, cant_viajes),
weight = cant_viajes,
fill = hora_totales_viaje) ) +
geom_bar(position="stack", stat="identity") +
scale_fill_continuous(low="yellow", high="red")+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(
title="Viajes por Vehículo",
x = "Patente Vehículo",
y = "Cantidad de Viajes" )+
geom_text(aes(label=cant_viajes), vjust=0.5,hjust=1.25, color="white", size=4, angle = 90)
viajes_d <- viajes_d %>%
mutate(dia_viaje = weekdays(as.Date(dmy(viajes_d$fecha_viaje)))) %>%
mutate(dia_orden = wday(as.Date(dmy(viajes_d$fecha_viaje))))
#con dmy le "digo" a weekdays como está escrita la fecha (dia-mes-año)
#guardo cambio en nueva variable
viajes_e <- viajes_d
head(viajes_e)
## # A tibble: 6 x 18
## id_viaje dependencia origen latitud_origen longitud_origen pasajero
## <dbl> <chr> <chr> <chr> <chr> <chr>
## 1 519 ASG - Depa~ Peron~ -34.604793 -58.369208 DITCHOFF
## 2 1574 Dir. Gral.~ Peron~ -34.604793 -58.369208 ROXANA
## 3 2174 ASG - Econ~ Peron~ -34.604793 -58.369208 TUCHI
## 4 103 ASG - Depa~ Peron~ -34.604793 -58.369208 DITCHOFF
## 5 730 Admin. Ser~ Peron~ -34.604793 -58.369208 ROCHA J
## 6 1235 ASG - Depa~ Peron~ -34.604793 -58.369208 LAROTON~
## # ... with 12 more variables: destino <chr>, latitud_destino <chr>,
## # longitud_destino <chr>, fecha_viaje <chr>, hora_salida <time>,
## # hora_regreso <time>, conductor <chr>, patente_vehiculo <chr>,
## # duracion_viaje <drtn>, duracion_viaje_numerico <dbl>, dia_viaje <chr>,
## # dia_orden <dbl>
#tabla de viajes por día de la semana
viajes_por_dia_de_semana <- viajes_e %>%
group_by(dia_viaje, dia_orden) %>%
summarise(
cant_viajes=n(),
hora_totales_viaje =round(sum(duracion_viaje_numerico)/60, digits=2),
destinos_distintos = n_distinct(destino),
)
viajes_por_dia_de_semana
## # A tibble: 7 x 5
## # Groups: dia_viaje [7]
## dia_viaje dia_orden cant_viajes hora_totales_viaje destinos_distintos
## <chr> <dbl> <int> <dbl> <int>
## 1 domingo 1 47 69.8 18
## 2 jueves 5 349 705. 50
## 3 lunes 2 289 522. 47
## 4 martes 3 367 729. 47
## 5 miércoles 4 386 836. 50
## 6 sábado 7 64 136. 21
## 7 viernes 6 380 813. 45
p <- ggplot(data=viajes_por_dia_de_semana,
aes(x=reorder(dia_viaje, dia_orden), y=cant_viajes)) +
geom_bar(stat="identity", width=0.90, fill="steelblue")+
geom_text(aes(label=cant_viajes), vjust=1.6, color="white", size=3.5)+
labs(
title="Cantidad de Viajes por Día de Semana",
x = "Día de semana",
y = "Cantidad de Viajes" )+
theme_minimal()
p
La distribución de viajes tiene correspondencia con el manejo cotiadiano de la remisería.
destinos_tiempos_viaje_conductores <- viajes_e %>%
select(destino, conductor, duracion_viaje_numerico)
head(destinos_tiempos_viaje_conductores)
## # A tibble: 6 x 3
## destino conductor duracion_viaje_nume~
## <chr> <chr> <dbl>
## 1 Las Heras, General 1680 ROCHA Juan Marc~ 10
## 2 Quinta Presidencial de Olivos (Oli~ ARIAS Claudio 10
## 3 Quinta Presidencial de Olivos (Oli~ ALVAREZ Ariel 15
## 4 Quinta Presidencial de Olivos (Oli~ FIGUERAS Maximi~ 20
## 5 Quinta Presidencial de Olivos (Oli~ ROCHA Juan Carl~ 20
## 6 Av Roca y Av Escalada LAROTONDA Hécto~ 20
destinos_tiempos_viaje_conductores <- viajes_e %>%
group_by(destino, conductor) %>%
summarise(
promedio_tiempo_viaje=round(mean(duracion_viaje_numerico),digits = 2),
cant_viajes=n()
)
head(destinos_tiempos_viaje_conductores)
## # A tibble: 6 x 4
## # Groups: destino [2]
## destino conductor promedio_tiempo_vi~ cant_viajes
## <chr> <chr> <dbl> <int>
## 1 11 DE SEPTIEMBRE 28~ CAPOZZUCCA Humberto~ 60 1
## 2 25 DE MAYO 741 ALVAREZ Ariel 140 2
## 3 25 DE MAYO 741 ARIAS Claudio 98.8 4
## 4 25 DE MAYO 741 CAPOZZUCCA Humberto~ 275 1
## 5 25 DE MAYO 741 CATRILEF Daniel 118. 3
## 6 25 DE MAYO 741 FIGUERAS Maximiliano 68 5
destinos_tiempos_viaje_conductores_top_20 <- destinos_tiempos_viaje_conductores %>%
filter(cant_viajes>20)
destinos_tiempos_viaje_conductores_top_20
## # A tibble: 14 x 4
## # Groups: destino [4]
## destino conductor promedio_tiempo_~ cant_viajes
## <chr> <chr> <dbl> <int>
## 1 Aeroparque Jorge Newber~ FIGUERAS Maximil~ 106. 22
## 2 Av Roca y Av Escalada GAZZANEGO Albert~ 50.4 22
## 3 Av Roca y Av Escalada LAROTONDA Héctor~ 47.7 30
## 4 Av Roca y Av Escalada ROCHA Juan Marce~ 49.8 22
## 5 Pza. Rep. del Paraguay CATRILEF Daniel 104. 22
## 6 Quinta Presidencial de ~ ARIAS Claudio 99.4 26
## 7 Quinta Presidencial de ~ CAPOZZUCCA Humbe~ 116. 63
## 8 Quinta Presidencial de ~ CATRILEF Daniel 137. 31
## 9 Quinta Presidencial de ~ DIAZ DE ESPADA V~ 101. 36
## 10 Quinta Presidencial de ~ FIGUERAS Maximil~ 125. 128
## 11 Quinta Presidencial de ~ GAZZANEGO Albert~ 116. 81
## 12 Quinta Presidencial de ~ LAROTONDA Héctor~ 140. 105
## 13 Quinta Presidencial de ~ ROCHA Juan Carlos 163. 61
## 14 Quinta Presidencial de ~ ROCHA Juan Marce~ 116. 64
Solo hay 14 combinaciones destino/conductor con mas de 20 viajes
ggplot(data = destinos_tiempos_viaje_conductores_top_20, aes(x = conductor, y = promedio_tiempo_viaje)) +
geom_bar(stat="identity", width=0.90, fill="steelblue") +
facet_wrap(~ destinos_tiempos_viaje_conductores_top_20$destino)+
theme( axis.text.x = element_text( angle = 90, hjust = 1 ) )
Solo hay dos destinos que tienen mas de 20 viajes y mas de un conductor que haya realizado esos viajes.
tabla <- destinos_tiempos_viaje_conductores_top_20 %>%
filter(destino == "Quinta Presidencial de Olivos (Olivos, Vicente López)" | destino == "Av Roca y Av Escalada")
ggplot(data = tabla, aes(x = conductor, y = promedio_tiempo_viaje)) +
geom_bar(stat="identity", width=0.90, fill="steelblue") +
facet_wrap(~ tabla$destino)+
theme( axis.text.x = element_text( angle = 90, hjust = 1 ) )
No hay diferencias significativas entre los los tiempos promedios de viajes para los mismos conductores y destinos.
#Retiro apostrofe inicial
viajes_e$latitud_origen <- gsub("'","" , viajes_e$latitud_origen ,ignore.case = TRUE)
viajes_e$longitud_origen <- gsub("'","" , viajes_e$longitud_origen ,ignore.case = TRUE)
viajes_e$latitud_destino <- gsub("'","" , viajes_e$latitud_destino ,ignore.case = TRUE)
viajes_e$longitud_destino <- gsub("'","" , viajes_e$longitud_destino ,ignore.case = TRUE)
Volver a Vista estructura general de datos
viajes_e$latitud_origen <- gsub("[\r\n]","" , viajes_e$latitud_origen ,ignore.case = TRUE)
viajes_e$longitud_origen <- gsub("[\r\n]","" , viajes_e$longitud_origen ,ignore.case = TRUE)
viajes_e$latitud_destino <- gsub("[\r\n]","" , viajes_e$latitud_destino ,ignore.case = TRUE)
viajes_e$longitud_destino <- gsub("[\r\n]","" , viajes_e$longitud_destino ,ignore.case = TRUE)
#Paso latitudes y longitudes a numero
viajes_e <- viajes_e %>%
mutate(latitud_origen_num = as.double(latitud_origen),
longitud_origen_num = as.double(longitud_origen),
latitud_destino_num = as.double(latitud_destino),
longitud_destino_num = as.double(longitud_destino))
#grabo modificaciones en nueva variable
viajes_f <- viajes_e
summary(viajes_f$longitud_origen_num)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -58.37 -58.37 -58.37 -58.37 -58.37 -58.37
summary(viajes_f$latitud_origen_num)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -34.6 -34.6 -34.6 -34.6 -34.6 -34.6
summary(viajes_f$longitud_destino_num)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -58.71 -58.48 -58.43 -58.43 -58.40 -57.65 1
summary(viajes_f$latitud_destino_num)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -38.16 -34.61 -34.58 -34.62 -34.51 -34.41
departamentos_viajes <- departamentos %>%
filter(codpcia == "02" | codpcia == "06")
ggplot()+
geom_sf(data=departamentos_viajes) +
geom_point(data=viajes_f,
aes(x=longitud_destino_num,
y=latitud_destino_num)) +
coord_sf(xlim = c(-58.7, -58.2), ylim = c(-34.8, -34.51), expand = FALSE) +
labs(title = "Remisería Presidencial",
subtitle="Destinos Viajes")
#viajes por destino
viajes_por_destino <- viajes_f %>%
group_by(destino,longitud_destino_num,latitud_destino_num) %>%
summarise(
cant_viajes=n()
)
head(viajes_por_destino)
## # A tibble: 6 x 4
## # Groups: destino, longitud_destino_num [6]
## destino longitud_destino_n~ latitud_destino_~ cant_viajes
## <chr> <dbl> <dbl> <int>
## 1 11 DE SEPTIEMBRE 2810 ~ -58.5 -34.6 1
## 2 25 DE MAYO 741 -58.4 -34.6 30
## 3 3 DE FEBRERO AL 2000 C~ -58.5 -34.6 2
## 4 Aeroparque Jorge Newbe~ -58.4 -34.6 71
## 5 Aeropuerto Internacion~ -58.6 -34.8 14
## 6 Agrelo 4050 -58.4 -34.6 4
#selecciono departamentos CABA y Pcia. de Bs. As.
departamentos_viajes_destino <- departamentos %>%
filter(codpcia == "02" | codpcia == "06")
#Armo el mapa centrado en CABA
mapa_viajes_por_destino <- ggplot()+
geom_sf(data = departamentos_viajes_destino)+
geom_point(data = viajes_por_destino,
aes(x = longitud_destino_num,
y = latitud_destino_num,
size=2, color=cant_viajes)) +
coord_sf(xlim = c(-58.7, -58.2), ylim = c(-34.8, -34.51), expand = FALSE) +
labs(title = "Remisería Presidencia",
subtitle="Destinos Viajes")
#defino los colores para mostrar las catidades de viajes por destino
mapa_viajes_por_destino <- mapa_viajes_por_destino +
scale_color_gradient(low="blue", high="red")
# Grafico el mapa mostrando en hover destino y cantidad de viajes
ggplotly(mapa_viajes_por_destino, tooltip = c("destino", "cant_viajes"))
Se puede observar una gran diferencia en la cantidad de viajes a la Residencia Presidencial de Olivios. Una de las razones principales, además de los viajes de rutina, es que hacia inicios del año 2017 se quitó la lavandería existente en Casa Rosada y se comenzaron a enviar los manteles, individuales, servilletas y demás blanquería a la lavandería de Olivos.
#se usa el paquete leaflet para hacer mapas dinamicos
paleta_colores <- colorNumeric("Spectral",domain = viajes_por_destino$cant_viajes, reverse = T, n=8)
leaflet() %>%
setView(lng = -58.43, lat = -34.58, zoom = 12) %>%
addTiles() %>%
addProviderTiles("CartoDB.Positron") %>%
addPolygons(data = departamentos_viajes_destino,
stroke = FALSE,
fill = "#D24618",
color = "#D24618",
opacity = 0.55,
fillOpacity = 0.01,
weight = 3 ) %>%
addCircles(data=viajes_por_destino,
lng = ~longitud_destino_num,
lat = ~latitud_destino_num,
weight =2,
#cambio el tamaño de los puntos según la cantidad de viajes
# radius = ~sqrt(cant_viajes) * 33,
#cambio el color de los puntos según la cantidad de viajes
radius = 350,
color = ~paleta_colores(cant_viajes), fillOpacity = 0.95,
popup = ~htmlEscape(paste0(destino," | viajes: ", cant_viajes))
)
viajes_f <- viajes_f %>%
mutate(coords_origen = paste0(latitud_origen_num,"+",longitud_origen_num)) %>%
mutate(coords_destino = paste0(latitud_destino_num,"+",longitud_destino_num))
viajes_unicos <- viajes_f %>%
group_by(origen, destino,coords_origen,coords_destino) %>%
summarise(
cant_viajes_distintos=n(),
#calculo la duración promedio de un tramo del viaje (por ejemplo la ida) para poder comparar con lo obtenido de la app de Google
duracion_viaje_promedio_1_tramo = round(mean(duracion_viaje_numerico)/2),2)
viajes_unicos
## # A tibble: 57 x 7
## # Groups: origen, destino, coords_origen [56]
## origen destino coords_origen coords_destino cant_viajes_dis~
## <chr> <chr> <chr> <chr> <int>
## 1 Peron~ 11 DE ~ -34.604793+-~ -34.55219+-58~ 1
## 2 Peron~ 25 DE ~ -34.604793+-~ -34.599182+-5~ 30
## 3 Peron~ 3 DE F~ -34.604793+-~ -34.560509+-5~ 2
## 4 Peron~ Aeropa~ -34.604793+-~ -34.55693+-58~ 71
## 5 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~ 14
## 6 Peron~ Agrelo~ -34.604793+-~ -34.619075+-5~ 4
## 7 Peron~ Albare~ -34.604793+-~ -34.691701+-5~ 9
## 8 Peron~ Alem, ~ -34.604793+-~ -34.605451+-5~ 12
## 9 Peron~ AV BE~ -34.604793+-~ -34.615455+-5~ 1
## 10 Peron~ Av Riv~ -34.604793+-~ -34.631827+-5~ 10
## # ... with 47 more rows, and 2 more variables:
## # duracion_viaje_promedio_1_tramo <dbl>, `2` <dbl>
Calculo la duración promedio de un tramo del viaje (por ejemplo la ida) para poder comparar con lo obtenido de la app de Google
for (i in 1:nrow(viajes_unicos)) {
print(i)
o <- viajes_unicos[i, 3] %>% as.character()
d <- viajes_unicos[i, 4] %>% as.character()
print(o)
print(d)
query <- gmapsdistance(origin = o,
destination = d,
mode = "driving",
key="AIzaSyD2EC4CZII8wEzNdbWkNi_liRRamWb449g",
)
if (query$Status == "OK") {
viajes_unicos$Time[i] <- query$Time
viajes_unicos$Distance[i] <- query$Distance
}else{
viajes_unicos$Time[i] <- NA
viajes_unicos$Distance[i] <- NA
}
Sys.sleep(1)
}
## [1] 1
## [1] "-34.604793+-58.369208"
## [1] "-34.55219+-58.456663"
## [1] 2
## [1] "-34.604793+-58.369208"
## [1] "-34.599182+-58.371245"
## [1] 3
## [1] "-34.604793+-58.369208"
## [1] "-34.560509+-58.45129"
## [1] 4
## [1] "-34.604793+-58.369208"
## [1] "-34.55693+-58.412636"
## [1] 5
## [1] "-34.604793+-58.369208"
## [1] "-34.804342+-58.55067"
## [1] 6
## [1] "-34.604793+-58.369208"
## [1] "-34.619075+-58.423305"
## [1] 7
## [1] "-34.604793+-58.369208"
## [1] "-34.691701+-58.611248"
## [1] 8
## [1] "-34.604793+-58.369208"
## [1] "-34.605451+-58.370335"
## [1] 9
## [1] "-34.604793+-58.369208"
## [1] "-34.615455+-58.45129"
## [1] 10
## [1] "-34.604793+-58.369208"
## [1] "-34.631827+-58.47168"
## [1] 11
## [1] "-34.604793+-58.369208"
## [1] "-34.679583+-58.450304"
## [1] 12
## [1] "-34.604793+-58.369208"
## [1] "-34.587579+-58.369092"
## [1] 13
## [1] "-34.604793+-58.369208"
## [1] "-34.667705+-58.356089"
## [1] 14
## [1] "-34.604793+-58.369208"
## [1] "-34.674591+-58.36367"
## [1] 15
## [1] "-34.604793+-58.369208"
## [1] "-34.615589+-58.423967"
## [1] 16
## [1] "-34.604793+-58.369208"
## [1] "-34.584747+-58.397739"
## [1] 17
## [1] "-34.604793+-58.369208"
## [1] "-34.667705+-58.356089"
## [1] 18
## [1] "-34.604793+-58.369208"
## [1] "-34.648556+-58.402189"
## [1] 19
## [1] "-34.604793+-58.369208"
## [1] "-34.639329+-58.362696"
## [1] 20
## [1] "-34.604793+-58.369208"
## [1] "-34.635071+-58.397425"
## [1] 21
## [1] "-34.604793+-58.369208"
## [1] "-34.591684+-58.374665"
## [1] 22
## [1] "-34.604793+-58.369208"
## [1] "-34.603491+-58.414216"
## [1] 23
## [1] "-34.604793+-58.369208"
## [1] "-34.623539+-58.382215"
## [1] 24
## [1] "-34.604793+-58.369208"
## [1] "-34.674345+-58.456803"
## [1] 25
## [1] "-34.604793+-58.369208"
## [1] "-34.587384+-58.453067"
## [1] 26
## [1] "-34.604793+-58.369208"
## [1] "-34.405486+-58.705836"
## [1] 27
## [1] "-34.604793+-58.369208"
## [1] "-34.581243+-58.402024"
## [1] 28
## [1] "-34.604793+-58.369208"
## [1] "-34.582356+-58.402579"
## [1] 29
## [1] "-34.604793+-58.369208"
## [1] "-34.573892+-58.418461"
## [1] 30
## [1] "-34.604793+-58.369208"
## [1] "-34.66933+-58.466922"
## [1] 31
## [1] "-34.604793+-58.369208"
## [1] "-34.570003+-58.433604"
## [1] 32
## [1] "-34.604793+-58.369208"
## [1] "-34.599754+-58.397926"
## [1] 33
## [1] "-34.604793+-58.369208"
## [1] "-34.612127+-58.424129"
## [1] 34
## [1] "-34.604793+-58.369208"
## [1] "-34.574095+-58.421458"
## [1] 35
## [1] "-34.604793+-58.369208"
## [1] "-34.589203+-58.419093"
## [1] 36
## [1] "-34.604793+-58.369208"
## [1] "-34.61417+-58.439875"
## [1] 37
## [1] "-34.604793+-58.369208"
## [1] "-34.606614+-58.42611"
## [1] 38
## [1] "-34.604793+-58.369208"
## [1] "-34.617621+-58.404053"
## [1] 39
## [1] "-34.604793+-58.369208"
## [1] "-34.592797+-58.390641"
## [1] 40
## [1] "-34.604793+-58.369208"
## [1] "-34.711907+-58.492146"
## [1] 41
## [1] "-34.604793+-58.369208"
## [1] "-34.542573+-58.455394"
## [1] 42
## [1] "-34.604793+-58.369208"
## [1] "-34.58322+-58.393951"
## [1] 43
## [1] "-34.604793+-58.369208"
## [1] "-34.591275+-58.385837"
## [1] 44
## [1] "-34.604793+-58.369208"
## [1] "-34.5568+-58.506721"
## [1] 45
## [1] "-34.604793+-58.369208"
## [1] "-34.588652+-58.383823"
## [1] 46
## [1] "-34.604793+-58.369208"
## [1] "-34.615507+-58.374597"
## [1] 47
## [1] "-34.604793+-58.369208"
## [1] "-34.615507+NA"
## [1] 48
## [1] "-34.604793+-58.369208"
## [1] "-34.609703+-58.407361"
## [1] 49
## [1] "-34.604793+-58.369208"
## [1] "-34.54187+-58.522394"
## [1] 50
## [1] "-34.604793+-58.369208"
## [1] "-34.609657+-58.390298"
## [1] 51
## [1] "-34.604793+-58.369208"
## [1] "-34.589143+-58.398404"
## [1] 52
## [1] "-34.604793+-58.369208"
## [1] "-34.514948+-58.482784"
## [1] 53
## [1] "-34.604793+-58.369208"
## [1] "-38.1645+-57.6472"
## [1] 54
## [1] "-34.604793+-58.369208"
## [1] "-34.604235+-58.369376"
## [1] 55
## [1] "-34.604793+-58.369208"
## [1] "-34.616389+-58.424418"
## [1] 56
## [1] "-34.604793+-58.369208"
## [1] "-34.577237+-58.409961"
## [1] 57
## [1] "-34.604793+-58.369208"
## [1] "-34.642916+-58.492227"
Time se registra en segundos, Distance se registra en metros.
viajes_unicos <- viajes_unicos %>%
mutate(tiempo_min = round(Time/60,2)) %>%
mutate(distancia_km = round(Distance/1000,2))
viajes_unicos
## # A tibble: 57 x 11
## # Groups: origen, destino, coords_origen [56]
## origen destino coords_origen coords_destino cant_viajes_dis~
## <chr> <chr> <chr> <chr> <int>
## 1 Peron~ 11 DE ~ -34.604793+-~ -34.55219+-58~ 1
## 2 Peron~ 25 DE ~ -34.604793+-~ -34.599182+-5~ 30
## 3 Peron~ 3 DE F~ -34.604793+-~ -34.560509+-5~ 2
## 4 Peron~ Aeropa~ -34.604793+-~ -34.55693+-58~ 71
## 5 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~ 14
## 6 Peron~ Agrelo~ -34.604793+-~ -34.619075+-5~ 4
## 7 Peron~ Albare~ -34.604793+-~ -34.691701+-5~ 9
## 8 Peron~ Alem, ~ -34.604793+-~ -34.605451+-5~ 12
## 9 Peron~ AV BE~ -34.604793+-~ -34.615455+-5~ 1
## 10 Peron~ Av Riv~ -34.604793+-~ -34.631827+-5~ 10
## # ... with 47 more rows, and 6 more variables:
## # duracion_viaje_promedio_1_tramo <dbl>, `2` <dbl>, Time <dbl>,
## # Distance <dbl>, tiempo_min <dbl>, distancia_km <dbl>
viajes_unicos_20 <- viajes_unicos %>%
filter(distancia_km>20) %>%
filter(destino!="Residencia Presidencial de Chapadmalal")
viajes_unicos_20
## # A tibble: 5 x 11
## # Groups: origen, destino, coords_origen [5]
## origen destino coords_origen coords_destino cant_viajes_dis~
## <chr> <chr> <chr> <chr> <int>
## 1 Peron~ Aeropu~ -34.604793+-~ -34.804342+-5~ 14
## 2 Peron~ Albare~ -34.604793+-~ -34.691701+-5~ 9
## 3 Peron~ COUNTR~ -34.604793+-~ -34.405486+-5~ 1
## 4 Peron~ Mercad~ -34.604793+-~ -34.711907+-5~ 13
## 5 Peron~ Posada~ -34.604793+-~ -34.54187+-58~ 14
## # ... with 6 more variables: duracion_viaje_promedio_1_tramo <dbl>,
## # `2` <dbl>, Time <dbl>, Distance <dbl>, tiempo_min <dbl>,
## # distancia_km <dbl>
dat <- data.frame(
tiempo_1_tramo_estimado = viajes_unicos_20$duracion_viaje_promedio_1_tramo,
tiempo_google = viajes_unicos_20$tiempo_min,
destino = viajes_unicos_20$destino
)
dat_long <- dat %>%
gather("Estimaciones", "Minutos", -destino)
#esto genera un lista de destino|estimaciones|minutos (repite destino para cada una de las variables)
ggplot(dat_long, aes(x = destino, y = Minutos, fill = Estimaciones)) +
geom_col(position = "dodge")+ #evita que se colapsen las columas y las muestra separadas
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
labs(
title="Comparacion de Tiempos de Viaje por Destino",
subtitle = "Tiempo Promedio Estimado Remiseria vs Tiempo Estimado Google",
x = "Destinos",
y = "Duración en Minutos" )
Una posible causa de la gran diferencia de los tiempos de viaje es que generalmente los choferes esperan a los pasajeros en los destinos. Para mejorar el control podría registrarse el tiempo de espera en destino.
Flexibilizar la asignación de los chofferes a funcionarios determinados para que puedan realizar más viajes. Podría definirse una cantidad de choferes asignados a funcionarios pero no individualmente sino como una guardia especial.
Podría pensarse en prioridades (tanto de funcioanrios como de dependencias) para el uso del los vehículos y no en asignaciones fijas y poder distribuir los viajes a los choferes según disponibilidad y no tanto por asignación. Ver gráfico “Cantidad de viajes / horas de viaje por vehículo”
Los datos registrados no sos suficientes para llevar un control adecuado de los viajes de la remisería. Sería adecuado contar con un sistema de seguimiento vehicular satelital
FIN